from __future__ import annotations
from base.ship_enum import ShipType, ArmorType


class Retrofit:
    def __init__(self, allowed=False, enable: bool = False, **kwargs):
        """
        改造信息, 存储舰船的改造信息及改造状态
        :param allowed: 舰船是否允许改造
        :param enable: 舰船是否改造
        :param kwargs: 发生改变的属性, 可以使用以下键:
            ship_type_change: 如果舰船类型发生改变, 传递改变后的舰船类型
            armor_type_change: 如果舰船装甲类型发生改变, 传递改变后的装甲类型
            以下是改变的属性值, 如果属性值发生改变, 传递改变的数值, 增加为正, 减少为负
            hp: 耐久
            rld: 装填
            fp: 炮击
            trp: 雷击
            eva: 机动
            aa: 防空
            avi: 航空
            acc: 命中
            asw: 反潜
            lck: 幸运
            spd: 航速
        """
        self._allowed = allowed
        self._enable = enable
        self._ship_type_change = kwargs.get('ship_type_change')
        self._hp = kwargs.get('hp')
        self._armor_type_change = kwargs.get('armor_type_change')
        self._rld = kwargs.get('rld')
        self._fp = kwargs.get('fp')
        self._trp = kwargs.get('trp')
        self._eva = kwargs.get('eva')
        self._aa = kwargs.get('aa')
        self._avi = kwargs.get('avi')
        self._acc = kwargs.get('acc')
        self._asw = kwargs.get('asw')
        self._lck = kwargs.get('lck')
        self._spd = kwargs.get('spd')

    @property
    def flag_allowed(self):
        """是否允许改造"""
        return self._allowed

    @property
    def flag_enable(self):
        if self._allowed:
            return self._enable
        else:
            return False

    @flag_enable.setter
    def flag_enable(self, value):
        if self._allowed:
            self._enable = value
        else:
            raise ValueError("不允许改造的舰船禁止设置改造状态")

    def get_inc_by_attr(self, attr) -> int | None:
        """如果属性值获得了提升, 返回提升值, 否则返回0"""
        if self._allowed and self._enable:
            return getattr(self, f'_{attr}')
        else:
            return None

    def append_retrofit(self):
        """新增改造, 使原本不允许改造的舰船允许改造"""
        self._allowed = True

    @property
    def ship_type_change(self) -> ShipType | None:
        """如果舰船类型发生改变, 返回改变后的类型, 否则返回None"""
        return self._ship_type_change

    @property
    def armor_type_change(self) -> ArmorType | None:
        """如果装甲类型发生改变, 返回改变后的装甲类型, 否则返回None"""
        return self._armor_type_change
